﻿/**
 * 封装了一系列帮助方法，用来处理弹出消息。
 */
Ext.define('Happy.Msg', {
    singleton: true,

    /**
     * @readonly
     * @property 消息的标题。
     */
    TITLE: '温馨提示',

    /**
     * @readonly
     * @property 加载失败的提示消息。
     */
    LOAD_FAILURE_MSG: '数据加载失败！',
    /**
     * @readonly
     * @property 删除失败的提示消息。
     */
    DELETE_FAILURE_MSG: '删除失败！',
    /**
     * @readonly
     * @property 保存失败的提示消息。
     */
    SAVE_FAILURE_MSG: '保存失败！',

    /**
     * @readonly
     * @property 删除成功的提示消息。
     */
    DELETE_SUCCESS_MSG: '删除成功！',
    /**
     * @readonly
     * @property 保存成功的提示消息。
     */
    SAVE_SUCCESS_MSG: '保存成功！',

    /**
     * @readonly
     * @property 删除确认的标题。
     */
    DELETE_CONFIRM_TITLE: '删除确认',
    /**
     * @readonly
     * @property 删除确认的提示消息。
     */
    DELETE_CONFIRM_MSG: '确定执行删除吗？',

    /**
     * 显示加载失败的提示消息。
     * 
     * @param {String} [msg] 提示消息
     * @return {Ext.window.Window}
     */
    showLoadFailure: function (msg) {
        var me = this;

        return me.showError(msg || me.LOAD_FAILURE_MSG);
    },

    /**
     * 显示删除失败的提示消息。
     * 
     * @param {String} [msg] 提示消息
     * @return {Ext.window.Window}
     */
    showDeleteFailure: function (msg) {
        var me = this;

        return me.showError(msg || me.DELETE_FAILURE_MSG);
    },

    /**
     * 显示保存失败的提示消息。
     * 
     * @param {String} [msg] 提示消息
     * @return {Ext.window.Window}
     */
    showSaveFailure: function (msg) {
        var me = this;

        return me.showError(msg || me.SAVE_FAILURE_MSG);
    },

    /**
     * 显示失败的提示消息。
     * 
     * @param {String} msg 提示消息
     * @param {String} title 提示标题
     * @param {Object} option Ext.Msg.show()方法可以接受的配置对象
     * @return {Ext.window.Window}
     */
    showError: function (msg, title, option) {
        var me = this;

        option = option || {};

        return Ext.Msg.show(Ext.apply({
            title: title || me.TITLE,
            msg: msg,
            icon: Ext.Msg.ERROR,
            width: 300,
            modal: true
        }, option));
    },

    /**
     * 显示删除成功的提示消息。
     * 
     * @param {String} [msg] 提示消息
     * @return {Ext.window.Window}
     */
    showDeleteSuccess: function (msg) {
        var me = this;

        return me.showInfo(msg || me.DELETE_SUCCESS_MSG);
    },

    /**
     * 显示保存成功的提示消息。
     * 
     * @param {String} [msg] 提示消息
     * @return {Ext.window.Window}
     */
    showSaveSuccess: function (msg) {
        var me = this;

        return me.showInfo(msg || me.SAVE_SUCCESS_MSG);
    },

    /**
     * 显示成功的提示消息，默认显示 1 秒后自动消失。
     * 
     * @param {String} msg 提示消息
     * @param {String} title 提示标题
     * @return {Ext.window.Window}
     */
    showInfo: function (msg, title, option) {
        var me = this;

        if (me.showInfoTimer) {
            clearTimeout(me.showInfoTimer);
            delete me.showInfoTimer;
        }

        option = option || {};

        var msgWin = Ext.Msg.show(Ext.apply({
            title: title || me.TITLE,
            msg: msg,
            icon: Ext.Msg.INFO,
            width: 300,
            modal: false,
        }, option));

        msgWin.animate({
            to: { top: 0 }
        });

        me.showInfoTimer = setTimeout(function () {
            msgWin.close();
            delete me.showInfoTimer;
        }, option.delay || 1500);

        return msgWin;
    },

    /**
     * 显示删除确认的提示消息。
     * 
     * @param {Function} yesAction 确认后执行的方法
     * @param {Function} noAction 取消后执行的方法
     * @return {Ext.window.Window}
     */
    confirmDelete: function (yesAction, noAction) {
        var me = this;

        return me.confirm(me.DELETE_CONFIRM_MSG, me.DELETE_CONFIRM_TITLE, yesAction, noAction);
    },

    /**
     * 显示确认的提示消息。
     * 
     * @param {String} msg 提示消息
     * @param {String} title 提示标题
     * @param {Function} yesAction 确认后执行的方法
     * @param {Function} noAction 取消后执行的方法
     * @return {Ext.window.Window}
     */
    confirm: function (msg, title, yesAction, noAction) {
        noAction = noAction || Ext.emptyFn;

        return Ext.Msg.confirm(title, msg, function (btn) {
            if (btn === 'yes') {
                yesAction();
            }
            else {
                noAction();
            }
        });
    }
});